package com.offics.loan.domain.repository;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.offics.loan.domain.entity.RepaymentRecord;

import java.util.List;
import java.util.Optional;

/**
 * 还款记录仓储接口
 */
public interface RepaymentRecordRepository {

    /**
     * 根据ID查询还款记录
     *
     * @param id 还款记录ID
     * @return 还款记录信息
     */
    Optional<RepaymentRecord> findById(Long id);

    /**
     * 根据交易编号查询还款记录
     *
     * @param tradeNo 交易编号
     * @return 还款记录信息
     */
    Optional<RepaymentRecord> findByTradeNo(String tradeNo);

    /**
     * 根据贷款ID查询还款记录列表
     *
     * @param loanId 贷款ID
     * @return 还款记录列表
     */
    List<RepaymentRecord> findByLoanId(Long loanId);

    /**
     * 根据用户ID查询还款记录列表
     *
     * @param userId 用户ID
     * @return 还款记录列表
     */
    List<RepaymentRecord> findByUserId(Long userId);

    /**
     * 根据还款计划ID查询还款记录列表
     *
     * @param repaymentPlanId 还款计划ID
     * @return 还款记录列表
     */
    List<RepaymentRecord> findByRepaymentPlanId(Long repaymentPlanId);

    /**
     * 根据用户ID和状态查询还款记录列表
     *
     * @param userId 用户ID
     * @param status 状态
     * @return 还款记录列表
     */
    List<RepaymentRecord> findByUserIdAndStatus(Long userId, Integer status);

    /**
     * 分页查询还款记录
     *
     * @param page 分页参数
     * @param userId 用户ID
     * @param loanId 贷款ID
     * @param status 状态
     * @return 分页结果
     */
    IPage<RepaymentRecord> findPage(IPage<RepaymentRecord> page, Long userId, Long loanId, Integer status);

    /**
     * 保存还款记录
     *
     * @param repaymentRecord 还款记录信息
     * @return 保存后的还款记录信息
     */
    boolean save(RepaymentRecord repaymentRecord);

    /**
     * 保存还款记录并返回保存后的还款记录
     *
     * @param repaymentRecord 还款记录信息
     * @return 保存后的还款记录信息
     */
    RepaymentRecord saveAndReturn(RepaymentRecord repaymentRecord);

    /**
     * 更新还款记录
     *
     * @param repaymentRecord 还款记录信息
     * @return 是否成功
     */
    boolean update(RepaymentRecord repaymentRecord);

    /**
     * 根据ID删除还款记录
     *
     * @param id 还款记录ID
     * @return 是否成功
     */
    boolean deleteById(Long id);

    /**
     * 根据贷款ID删除还款记录
     *
     * @param loanId 贷款ID
     * @return 是否成功
     */
    boolean deleteByLoanId(Long loanId);

    /**
     * 根据用户ID删除还款记录
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteByUserId(Long userId);

    /**
     * 根据还款计划ID删除还款记录
     *
     * @param repaymentPlanId 还款计划ID
     * @return 是否成功
     */
    boolean deleteByRepaymentPlanId(Long repaymentPlanId);

    /**
     * 生成交易编号
     *
     * @return 交易编号
     */
    String generateTradeNo();

    /**
     * 检查交易编号是否存在
     *
     * @param tradeNo 交易编号
     * @return 是否存在
     */
    boolean existsByTradeNo(String tradeNo);
}
